/*
 * Copyright (c) 2024 Black Sesame Technologies
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _DAL_CYCLONEDDS_REF_COUNT_HPP_
#define _DAL_CYCLONEDDS_REF_COUNT_HPP_

#include <atomic>

class ReferenceCount
{
public:
    void Decrease()
    {
        uint32_t current_reference_count = reference_count_.load();
        do {
            if (current_reference_count == 0)
                return;
        } while (!reference_count_.compare_exchange_strong(current_reference_count,
                                                           current_reference_count - 1));
    }
    uint32_t Get()
    {
        return reference_count_.load();
    }
    void Increase()
    {
        reference_count_.fetch_add(1);
    }

private:
    std::atomic<uint32_t> reference_count_ = { };
};

#endif  // _DAL_CYCLONEDDS_REF_COUNT_HPP_